home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / TURB_VIS / TVISION / TVGUID10.PAS < prev   
Pascal/Delphi Source File  |  1990-10-23  |  6KB  |  225 lines

  1. {************************************************}
  2. {                                                }
  3. {   Turbo Pascal 6.0                             }
  4. {   Demo program from the Turbo Vision Guide     }
  5. {                                                }
  6. {   Copyright (c) 1990 by Borland International  }
  7. {                                                }
  8. {************************************************}
  9.  
  10. program TVGUID10;
  11.  
  12. uses Objects, Drivers, Views, Menus, App;
  13.  
  14. const
  15.   FileToRead        = 'TVGUID10.PAS';
  16.   MaxLines          = 100;
  17.   WinCount: Integer =   0;
  18.   cmFileOpen        = 100;
  19.   cmNewWin          = 101;
  20.  
  21. var
  22.   LineCount: Integer;
  23.   Lines: array[0..MaxLines - 1] of PString;
  24.  
  25. type
  26.   TMyApp = object(TApplication)
  27.     procedure HandleEvent(var Event: TEvent); virtual;
  28.     procedure InitMenuBar; virtual;
  29.     procedure InitStatusLine; virtual;
  30.     procedure NewWindow;
  31.   end;
  32.  
  33.   PInterior = ^TInterior;
  34.   TInterior = object(TScroller)
  35.     constructor Init(var Bounds: TRect; AHScrollBar,
  36.       AVScrollBar: PScrollBar);
  37.     procedure Draw; virtual;
  38.   end;
  39.  
  40.   PDemoWindow = ^TDemoWindow;
  41.   TDemoWindow = object(TWindow)
  42.     RInterior, LInterior: PInterior;
  43.     constructor Init(Bounds: TRect; WinTitle: String; WindowNo: Word);
  44.     function MakeInterior(Bounds: TRect; Left: Boolean): PInterior;
  45.     procedure SizeLimits(var Min, Max: TPoint); virtual;
  46.   end;
  47.  
  48. procedure ReadFile;
  49. var
  50.   F: Text;
  51.   S: String;
  52. begin
  53.   LineCount := 0;
  54.   Assign(F, FileToRead);
  55.   {$I-}
  56.   Reset(F);
  57.   {$I+}
  58.   if IOResult <> 0 then
  59.   begin
  60.     Writeln('Cannot open ', FileToRead);
  61.     Halt(1);
  62.   end;
  63.   while not Eof(F) and (LineCount < MaxLines) do
  64.   begin
  65.     Readln(F, S);
  66.     Lines[LineCount] := NewStr(S);
  67.     Inc(LineCount);
  68.   end;
  69.   Close(F);
  70. end;
  71.  
  72. procedure DoneFile;
  73. var
  74.   I: Integer;
  75. begin
  76.   for I := 0 to LineCount - 1 do
  77.     if Lines[I] <> nil then DisposeStr(Lines[i]);
  78. end;
  79.  
  80. { TInterior }
  81. constructor TInterior.Init(var Bounds: TRect; AHScrollBar,
  82.   AVScrollBar: PScrollBar);
  83. begin
  84.   TScroller.Init(Bounds, AHScrollBar, AVScrollBar);
  85.   Options := Options or ofFramed;
  86.   SetLimit(128, LineCount);
  87. end;
  88.  
  89. procedure TInterior.Draw;
  90. var
  91.   Color: Byte;
  92.   I, Y: Integer;
  93.   B: TDrawBuffer;
  94. begin
  95.   Color := GetColor(1);
  96.   for Y := 0 to Size.Y - 1 do
  97.   begin
  98.     MoveChar(B, ' ', Color, Size.X);
  99.     i := Delta.Y + Y;
  100.     if (I < LineCount) and (Lines[I] <> nil) then
  101.       MoveStr(B, Copy(Lines[I]^, Delta.X + 1, Size.X), Color);
  102.     WriteLine(0, Y, Size.X, 1, B);
  103.   end;
  104. end;
  105.  
  106. { TDemoWindow }
  107. constructor TDemoWindow.Init(Bounds: TRect; WinTitle: String;
  108.   WindowNo: Word);
  109. var
  110.   S: string[3];
  111.   R: TRect;
  112. begin
  113.   Str(WindowNo, S);
  114.   TWindow.Init(Bounds, WinTitle + ' ' + S, wnNoNumber);
  115.   GetExtent(Bounds);
  116.   R.Assign(Bounds.A.X, Bounds.A.Y, Bounds.B.X div 2 + 1, Bounds.B.Y);
  117.   LInterior := MakeInterior(R, True);
  118.   LInterior^.GrowMode := gfGrowHiY;
  119.   Insert(Linterior);
  120.   R.Assign(Bounds.B.X div 2, Bounds.A.Y, Bounds.B.X, Bounds.B.Y);
  121.   RInterior := MakeInterior(R,False);
  122.   RInterior^.GrowMode := gfGrowHiX + gfGrowHiY;
  123.   Insert(RInterior);
  124. end;
  125.  
  126. function TDemoWindow.MakeInterior(Bounds: TRect; Left: Boolean): PInterior;
  127. var
  128.   HScrollBar, VScrollBar: PScrollBar;
  129.   R: TRect;
  130. begin
  131.   R.Assign(Bounds.B.X - 1, Bounds.A.Y + 1, Bounds.B.X, Bounds.B.Y - 1);
  132.   VScrollBar := New(PScrollBar, Init(R));
  133.   VScrollBar^.Options := VScrollBar^.Options or ofPostProcess;
  134.   if Left then VScrollBar^.GrowMode := gfGrowHiY;
  135.   Insert(VScrollBar);
  136.   R.Assign(Bounds.A.X + 2, Bounds.B.Y - 1, Bounds.B.X - 2, Bounds.B.Y);
  137.   HScrollBar := New(PScrollBar, Init(R));
  138.   HScrollBar^.Options := HScrollBar^.Options or ofPostProcess;
  139.   if Left then HScrollBar^.GrowMode := gfGrowHiY + gfGrowLoY;
  140.   Insert(HScrollBar);
  141.   Bounds.Grow(-1, -1);
  142.   MakeInterior := New(PInterior, Init(Bounds, HScrollBar, VScrollBar));
  143. end;
  144.  
  145. procedure TDemoWindow.SizeLimits(var Min, Max: TPoint);
  146. var R: TRect;
  147. begin
  148.   TWindow.SizeLimits(Min, Max);
  149.   Min.X := LInterior^.Size.X + 9;
  150. end;
  151.  
  152. { TMyApp }
  153. procedure TMyApp.HandleEvent(var Event: TEvent);
  154. begin
  155.   TApplication.HandleEvent(Event);
  156.   if Event.What = evCommand then
  157.   begin
  158.     case Event.Command of
  159.       cmNewWin: NewWindow;
  160.     else
  161.       Exit;
  162.     end;
  163.     ClearEvent(Event);
  164.   end;
  165. end;
  166.  
  167. procedure TMyApp.InitMenuBar;
  168. var R: TRect;
  169. begin
  170.   GetExtent(R);
  171.   R.B.Y := R.A.Y + 1;
  172.   MenuBar := New(PMenuBar, Init(R, NewMenu(
  173.     NewSubMenu('~F~ile', hcNoContext, NewMenu(
  174.       NewItem('~O~pen', 'F3', kbF3, cmFileOpen, hcNoContext,
  175.       NewItem('~N~ew', 'F4', kbF4, cmNewWin, hcNoContext,
  176.       NewLine(
  177.       NewItem('E~x~it', 'Alt-X', kbAltX, cmQuit, hcNoContext,
  178.       nil))))),
  179.     NewSubMenu('~W~indow', hcNoContext, NewMenu(
  180.       NewItem('~N~ext', 'F6', kbF6, cmNext, hcNoContext,
  181.       NewItem('~Z~oom', 'F5', kbF5, cmZoom, hcNoContext,
  182.       nil))),
  183.     nil))
  184.   )));
  185. end;
  186.  
  187. procedure TMyApp.InitStatusLine;
  188. var R: TRect;
  189. begin
  190.   GetExtent(R);
  191.   R.A.Y := R.B.Y - 1;
  192.   StatusLine := New(PStatusLine, Init(R,
  193.     NewStatusDef(0, $FFFF,
  194.       NewStatusKey('', kbF10, cmMenu,
  195.       NewStatusKey('~Alt-X~ Exit', kbAltX, cmQuit,
  196.       NewStatusKey('~F4~ New', kbF4, cmNewWin,
  197.       NewStatusKey('~Alt-F3~ Close', kbAltF3, cmClose,
  198.       nil)))),
  199.     nil)
  200.   ));
  201. end;
  202.  
  203. procedure TMyApp.NewWindow;
  204. var
  205.   Window: PDemoWindow;
  206.   R: TRect;
  207. begin
  208.   Inc(WinCount);
  209.   R.Assign(0, 0, 45, 13);
  210.   R.Move(Random(34), Random(11));
  211.   Window := New(PDemoWindow, Init(R, 'Demo Window', WinCount));
  212.   DeskTop^.Insert(Window);
  213. end;
  214.  
  215. var
  216.   MyApp: TMyApp;
  217.  
  218. begin
  219.   ReadFile;
  220.   MyApp.Init;
  221.   MyApp.Run;
  222.   MyApp.Done;
  223.   DoneFile;
  224. end.
  225.